package com.enums;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

/**
 * @author guoQ.z
 * @date 2021/1/31 20:01
 * TODO
 */
public interface BaseEnum {
    /**
     * 通过枚举类型和code值获取对应的枚举类型
     *
     * @param enumsType enumsType
     * @param code      code
     * @param <T>       enumsType
     * @return enumsType
     */
    static <T extends BaseEnum> T valueOf(Class<T> enumsType, Integer code) {
        if (null == enumsType || null == code) {
            return null;
        }
        T[] enumConstants = (T[]) enumsType.getEnumConstants();
        if (null == enumConstants) {
            return null;
        }


        return Stream.of(enumConstants).filter(baseEnum -> baseEnum.getCode().equals(code)).findAny().orElseGet(() -> null);
    }

    static <T extends BaseEnum> Map<Integer, String> enumList(Class<? extends BaseEnum> enumsType) {
        if (null == enumsType) {
            return null;
        }
        Map<Integer, String> enumMap = new HashMap<>();
        BaseEnum[] enumConstants = enumsType.getEnumConstants();
        Stream.of(enumConstants).forEach(enumItem -> enumMap.put(enumItem.getCode(), enumItem.getDesc()));
        return enumMap;
    }

    static Object a() {
        System.out.println("a method ... ");
        return null;
    }

    /**
     * 获取code
     *
     * @return int
     */
    Integer getCode();

    /**
     * 获取desc
     *
     * @return string
     */
    String getDesc();
}
